// 题目要求：
// 给定两个整数，n 和 k，1 < n,k < 1000
// 给定 n 个正整数 a[i], 1 < a[i] < 1e10
// 要求从数组中取数，和尽可能得大，并且必须是 k 的倍数
// 如果有方案，输出和，没有方案，输出 -1

// 解题思路：01 背包 + 同余定理

// 同余定理：
// 如果 a % k = x, b % k = y
// (a + b) % k = (x + y) % k

// 定义 dp[i][j] 表示 [0, i] 区间中选数字，余数为 j 的最大和
// 分以下两种情况讨论：
// 1. 如果不选 i 位置的数字：dp[i][j] = dp[i - 1][j]
// 2. 如果选 i 位置的数字：
// 假设 a[i] % k == x，那么 [0, i - 1] 区间中需要找余数为 j - x 的数字
// 但是 j - x 有可能是负数，因此需要修正余数，(j - x + k) % k 这样就把余数修正了
// 因此 dp[i][j] = dp[i - 1][(j - a[i] % k + k) % k] + a[i]

// 初始化：
// 因为从前 0 个数字中挑是挑不出余数为正数的情况的，因此 dp[0][i] = -1
// 前 0 个数中挑余数为 0 的，就是啥也不挑的情况：dp[0][0] = 0;

// 先让 dp[i][j] = dp[i - 1][j]
// 如果选 a[i]，并且前面存在能挑出来和 a[i] 凑一起余数为 j 的情况，就取这两种情况的最大值
// 如果挑不出来 dp[i][j] = dp[i - 1][j]

// 返回值：
// 如果 dp[n][0] 不小于 0, 就返回 dp[n][0]
// 否则返回 -1

// 为什么 dp[i][j] 不用来表示从 [0, i - 1] 区间选和为 j 的最大值呢？
// 因为每个 a[i] 的取值都有可能取到 1e10，和就会超过 int 的范围
// 而 j 的取值就只能在 int 中取，new 不出来那么大的 dp 数组
// 因此这种情况可以考虑取余这种方式，而且题目中要求和能够整除 k，就是提示要取余的

import java.util.*;

public class DP01package {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        int k = in.nextInt();

        long[] arr = new long[n + 1];
        for(int i = 1; i <= n; i++){
            arr[i] = in.nextLong();
        }

        long[][] dp = new long[n + 1][k];
        for(int i = 1; i < k; i++){
            dp[0][i] = -1;
        }

        for(int i = 1; i <= n; i++){
            for(int j = 0; j < k; j++){
                dp[i][j] = dp[i - 1][j];
                if(dp[i - 1][(j - (int)(arr[i] % k) + k) % k] != -1){
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][(j - (int)(arr[i] % k) + k) % k] + arr[i]);
                }
            }
        }

        System.out.println(dp[n][0] <= 0 ? -1 : dp[n][0]);
    }
}
